package air2.totc.common;

import java.security.Key;
import java.util.ArrayList;
import java.util.List;

import javax.crypto.spec.SecretKeySpec;

import air2.totc.R;
import air2.totc.crypt.*;
import air2.totc.crypt.TripleDesEncoder;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.*;
import android.provider.ContactsContract.CommonDataKinds.*;
import android.telephony.SmsManager;
import android.util.Log;
import android.content.*;
import android.view.View;
import android.view.WindowManager.LayoutParams;
import android.widget.*;
import android.view.*;

public class envoyerSMS extends Activity {
	private static final int CONTACT_PICKER_RESULT = 1001;
	private static final String DEBUG_TAG = "totc";  
	private Button envoyerSMS,choisirContact;
	String[] name_Val=null;
	String[] phone_Val=null;
	AutoCompleteTextView numTel;
	private EditText message,cle;
	private RadioGroup choixCrypto;
	private RadioButton radioButtonAES;
	private RadioButton radioButtonRSA;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sendsms);
        choixCrypto=(RadioGroup)findViewById(R.id.choixCrypto);
        radioButtonAES=(RadioButton)findViewById(R.id.DES);
        radioButtonRSA=(RadioButton)findViewById(R.id.RSA);
        cle=(EditText)findViewById(R.id.cleText);
        message = (EditText) findViewById(R.id.corpsMessage);
        choixCrypto.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            public void onCheckedChanged(RadioGroup group,int checkedId) {
               int radioChecked = group.getCheckedRadioButtonId();
               switch(radioChecked){
               case R.id.RSA :
            	   cle.setVisibility(View.INVISIBLE);
            	   cle.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,1));
            	   break;
               case R.id.DES :
            	   cle.setVisibility(View.VISIBLE);
            	   cle.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
            	   break;
               case R.id.tripleDES :
            	   break;
               case R.id.AES :
            	   break;
               }
            }
        });
        
        numTel = (AutoCompleteTextView) findViewById(R.id.numerotel);
        numTel.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, getAllContactsAndPhones()));

        choisirContact = (Button) findViewById(R.id.choosecontact);
        choisirContact.setOnClickListener(new View.OnClickListener() {		
			public void onClick(View v) {
				pickContact(v);
			}
        });
        //on recup les variables de la vue d'avant (en l'occurence destinataire)
        //affichage de valeur dans le champ text (utile pour le débug)
        envoyerSMS = (Button) findViewById(R.id.envoyerSMS2Contact);
        envoyerSMS.setOnClickListener(new View.OnClickListener() {		
			public void onClick(View v) {
				  numTel = (AutoCompleteTextView) findViewById(R.id.numerotel);
				  message = (EditText) findViewById(R.id.corpsMessage);
				  //Toast.makeText(v.getContext(),"numero = "+temptel,Toast.LENGTH_LONG).show(); 
				  String messageStr = message.getText().toString();
				  switch(choixCrypto.getCheckedRadioButtonId()){
				  case R.id.DES :
					 // sendSMS(numtel,messageStr);
					  sendSMSCrypte(numTel.getText().toString(),messageStr,1);
				  	break;
	               case R.id.RSA :
	            	   sendSMSCrypte(numTel.getText().toString(),messageStr,9);
	            	   break;
	               case R.id.tripleDES :
	            	   sendSMSCrypte(numTel.getText().toString(),messageStr,2);
	            	   break;
	               case R.id.AES :
	            	   sendSMSCrypte(numTel.getText().toString(),messageStr,3);
	            	   break;
				  }
			}
        }); 
    }
	//renvoie une liste de String avec les noms des contacts et les numéros de téléphone.
    private List<String> getAllContactsAndPhones() {
        List<String> contacts = new ArrayList<String>();
        ContentResolver cr = getContentResolver();
        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

        if (cursor.getCount() > 0) {
            while (cursor.moveToNext()) {
                String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

                if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                    Cursor pCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                                            null, 
                                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 
                                            new String[]{contactId}, null);

                    while (pCursor.moveToNext()) {
                        String phoneNumber = pCursor.getString(pCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));                      
                        contacts.add(phoneNumber + " ( " + displayName + " )");
                    } 

                    pCursor.close();
                }
            }
        }       
        return contacts;
    }
    public void sendSMSCrypte(String numero,String messageAEnvoyer,int type){
    	String encMsg=""+type+"<>";
    	cle=(EditText)findViewById(R.id.cleText);
    	String passphrase = cle.getText().toString();
    	Toast.makeText(this, "test d'envoi passphrase"+passphrase.getBytes()+"cle="+passphrase+" messageAEnvoyer="+messageAEnvoyer,Toast.LENGTH_LONG).show();  
    	try{
	    	switch(type){
	    	case 1 : //DES
				DESEncoder enc = new DESEncoder(passphrase.getBytes());
				encMsg += enc.encode(messageAEnvoyer);
	    		break;
	    	case 2 : //3DES
	    		TripleDesEncoder encTDES = new TripleDesEncoder(passphrase.getBytes());
	    		encTDES.encode(messageAEnvoyer);
	    		break;
	    	case 3 : //AES
	    		AESEncoder encAES = new AESEncoder(passphrase.getBytes());
	    		encMsg+=encAES.encode(messageAEnvoyer);
	    		break;
	    	/*case 9 : //RSA
	    		// Récupération des clés...
	    		String prvKey, pubKey;
	    		
	    		
	    		// Création des objets clés
	    		Key myPrvKey, theirPubKey;
	    		myPrvKey = new SecretKeySpec(org.spongycastle.util.encoders.Base64.decode(prvKey), "RSA");
	    		theirPubKey = new SecretKeySpec(org.spongycastle.util.encoders.Base64.decode(pubKey), "RSA");
	    		
	    		// Création de l'encodeur
	    		RSAEncoder rsEnc = new RSAEncoder();
	    		rsEnc.setPrvKey(myPrvKey);
	    		rsEnc.setPubKey(theirPubKey);
	    		
	    		// Encodage
	    		encMsg+=rsEnc.encode(messageAEnvoyer);
	    		break;*/
	    	}
    	}catch(Exception e){
    		Toast.makeText(this, "erreur d'envoi",Toast.LENGTH_LONG).show();  
    	}
    	sendSMS(numero,encMsg);
    }
	//methode pour envoie de SMS
	public void sendSMS(String numero,String messageStr)
	{
        SmsManager manager = SmsManager.getDefault();
        Toast.makeText(this, "test envoie.",Toast.LENGTH_LONG).show();  
        // Message séparé en plusieurs chaines dans un tableau
        // au cas oé le message est trop lourd
        ArrayList<String> divText = manager.divideMessage(messageStr);
        // Si le message rentre dans une place du tableau, envoyer la ligne
        if (divText.size() == 1){ 
        	Toast.makeText(this, "SMS presque envoy�."+messageStr.toString(),Toast.LENGTH_LONG).show();  
        	manager.sendTextMessage(numero, null, messageStr, null, null);
        	Toast.makeText(this, "SMS  envoyé1.",Toast.LENGTH_LONG).show();  
        }
        else if (divText.size() > 1){
        	Toast.makeText(this, "SMS presque envoy�."+messageStr.toString(),Toast.LENGTH_LONG).show(); 
        	manager.sendMultipartTextMessage(numero, null, divText, null, null);
        	Toast.makeText(this, "SMS envoyé.",Toast.LENGTH_LONG).show();  
        }  
	}
	
	//simple action pour choisir un contact
	public void pickContact(View view) {  
	    Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,  
	            Contacts.CONTENT_URI);  
	    startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT);  
	}  
	
	//fonction appelée suite é la selection du contact 
	//on selectionne alors le numéro de téléphone du contact associé

	public void onActivityResult(int requeteCode, int resultCode, Intent data){
		 if (resultCode == RESULT_OK) {
			 String id;
			 switch(requeteCode){
			 case CONTACT_PICKER_RESULT :
		            Cursor cursor = null;  
		            String phoneNumber = "";  
		            try {  
		                Uri result = data.getData();  
		                Log.v(DEBUG_TAG, "Got a contact result: "  
		                        + result.toString());  
		  
		                // recupération du contactid
		                id = result.getLastPathSegment();  
		  
		                // requéte pour récupérer le numéro du téléphone
		                cursor = getContentResolver().query(Phone.CONTENT_URI,  
		                        null, Phone.CONTACT_ID + "=?", new String[] { id },  
		                        null);  
		  
		                int phoneIndex = cursor.getColumnIndex(Phone.DATA);  
		  
		                // on récupére le premier numéro de téléphone
		                if (cursor.moveToFirst()) {  
		                	phoneNumber = cursor.getString(phoneIndex);  
		                    Log.v(DEBUG_TAG, "numéro de téléphone ok : " + phoneNumber);  
		                } else {  
		                    Log.w(DEBUG_TAG, "pas de téléphone");  
		                }  
		            } catch (Exception e) {  
		                Log.e(DEBUG_TAG, "échec de la requéte", e);  
		            } finally {  
		                if (cursor != null) {  
		                    cursor.close();  
		                }  
		                AutoCompleteTextView phoneEntry = (AutoCompleteTextView) findViewById(R.id.numerotel);  
		                phoneEntry.setText(phoneNumber);  

		                if (phoneNumber.length() == 0) {  
		                    Toast.makeText(this, "No phone found for contact.",  
		                            Toast.LENGTH_LONG).show();  
		                }  
		  
		            }  
				 break;
 			 }
		 }else{
			 Log.w(DEBUG_TAG, "erreur de resultat pour une activity");
		 }
	}
}
